Software designers often use modular components to provide flexibility and extensibility of the design software. As a result of the modular construction, each component can be replaced or enlarged in functionality by new components. Unfortunately, the interface for each component must be defined in advance and cannot be changed afterwards. The interfaces for each component are defined during the design phase of the software. During implementation and testing, those interfaces may be modified, but once the interface is deployed, changes to the interface are no longer possible. For example, once the interface is deployed, a customer may have implemented the interface and created new components that use the interface. If the interface later changes, the implementation of the customer would fail.
It is possible to mitigate this problem by permitting new parameters that can be added to the interface, but must be flagged as optional. This permits old implementations to ignore the new parameters and allows new implementations to use them. Additionally, new methods may be added to the interface, but calling instances must address that the new method might not be implemented by an old class implementing the interface. As a result, very careful error handling is required.